package com.fxu.jushuitan.dto;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import com.fxu.framework.core.util.BeanUtil;
import lombok.Data;

import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 所有分页返回
 * @author fangxu
 * @since 2023-08-18
 * @version 1.0.0
 **/
@Data
public class PageRes<T> {
    //"datas":null,"requestId":null,"page_index":0,"has_next":false,"data_count":0,"page_count":0,"page_size":0
    /**
     * 请求ID
     */
    private String requestId;

    /**
     * 第几页
     */
    private String pageIndex;

    /**
     * 是否有下一页
     */
    private Boolean hasNext;

    /**
     * 总数据个数
     */
    private String dataCount;

    /**
     * 分页数
     */
    private String pageCount;

    /**
     * 返回结果
     */
    private Object datas;

    /**
     * 返回结果
     */
    private List<T> dataList;

    /**
     * 是否有下一页
     */
    public boolean hasNextPage() {
        return hasNext != null && hasNext;
    }

    /**
     * 获取数据集合
     * @param <T> 类型
     * @param clazz 类型类
     * @return 具体列表数据
     */
    @SuppressWarnings("unchecked")
    public <T> List<T> toList(Class<T> clazz) {
        if (datas instanceof Collection) {
            Collection<Object> list = (Collection<Object>) datas;
            return list.stream().filter(Objects::nonNull).map(d -> BeanUtil.toBean(d, clazz)).collect(Collectors.toList());
        } else {
            return CollUtil.toList(datas == null ? null : BeanUtil.toBean(datas, clazz));
        }
    }

    public static PageRes to(String body) {
        return JSONUtil.toBean(body, PageRes.class);
    }
}